package com.lnsoft.cac.server.handle.codec.frameMessage;


import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import lombok.Data;
import lombok.NonNull;

@Data
/**
 * 配置/状态交互---监测点参数
 * */
public class Cfg_MPArg_Msg {
    private int Measure_Point_ID;               //1byte     监测点号（无符号整数）
    private int Request_Set_Flag;               //1byte     参数配置类型标识：①0x00查询监测点参数②0x01设置监测点参数
    private int Request_Flag;                   //2byte     标识位：标识选择请求或设置的参数，字节位自低向高依次对应10-19的各选择请求或设置的参数项
    private int MIN_Time_Cycle;                 //1byte     电压平均值上送周期（单位：分钟），为数据间隔的整数倍。
    private int MIN_Time_Interval;              //1byte     电压平均值的数据间隔（单位：分钟）
    private int UL_Value;                       //4byte     电压上限值（电压值，单位：V），电压等级、电压上限值、电压下限值应同时设置，数据格式参见A.3.1。
    private int LL_Value;                       //4byte     电压下限值（电压值，单位：V），电压等级、电压上限值、电压下限值应同时设置，数据格式 参见A.3.1。
    private int Settle_Date;                    //1byte     月结算日（1-28）
    private int Voltage_Level;                  //4byte     一次电压等级（无符号整数，单位：V），电压等级、电压上限值、电压下限值应同时设置，数据格式参见A.3.1。
    private int MinData_AutoSend_Flag;          //1byte     分钟平均值主动上送标志：①0x00不上送②0x01上送
    private int DayData_AutoSend_Flag;          //1byte     日数据主动上送标志：①0x00不上送②0x01上送
    private int MonData_AutoSend_Flag;          //1byte     月数据主动上送标志：①0x00不上送②0x01上送
    private int SurpassAlarm_AutoSend_Flag;     //1byte     越限告警主动上送标志：①0x00不上送②0x01上送


    public ByteBuf toByteBuf() throws Exception{
        if (!Util.measurePointIDIsAvailable(Measure_Point_ID)) {
            throw new Exception("监测点号 设置异常");
        }
        if (Request_Set_Flag != (byte)0x00 && Request_Set_Flag != (byte)0x01) {
            throw new Exception("数据发送状态 设置异常");
        }
        if (MinData_AutoSend_Flag != (byte)0x00 && MinData_AutoSend_Flag != (byte)0x01) {
            throw new Exception("分钟平均值主动上送标志 设置异常");
        }
        if (DayData_AutoSend_Flag != (byte)0x00 && DayData_AutoSend_Flag != (byte)0x01) {
            throw new Exception("日数据主动上送标志 设置异常");
        }
        if (MonData_AutoSend_Flag != (byte)0x00 && MonData_AutoSend_Flag != (byte)0x01) {
            throw new Exception("月数据主动上送标志 设置异常");
        }
        if (SurpassAlarm_AutoSend_Flag != (byte)0x00 && SurpassAlarm_AutoSend_Flag != (byte)0x01) {
            throw new Exception("越限告警主动上送标志 设置异常");
        }

        ByteBuf bf = Unpooled.buffer(23);
        bf.writeByte(Measure_Point_ID);
        bf.writeByte(Request_Set_Flag);
        bf.writeShort(Request_Flag);
        bf.writeByte(MIN_Time_Cycle);
        bf.writeByte(MIN_Time_Interval);
        bf.writeInt(UL_Value);
        bf.writeInt(LL_Value);
        bf.writeByte(Settle_Date);
        bf.writeInt(Voltage_Level);
        bf.writeByte(MinData_AutoSend_Flag);
        bf.writeByte(DayData_AutoSend_Flag);
        bf.writeByte(MonData_AutoSend_Flag);
        bf.writeByte(SurpassAlarm_AutoSend_Flag);
        return bf;
    }


    //  解析 { 配置/状态交互---监测点参数} 帧报文内容区 到消息体中
    public static Cfg_MPArg_Msg dec_frame_body(@NonNull byte[] frameBody) throws Exception {
        ByteBuf bf = Unpooled.wrappedBuffer(frameBody);
        Cfg_MPArg_Msg msg = new Cfg_MPArg_Msg();
        int len = frameBody.length;
        if (len == 0) {
            return null;
        }
        msg.setMeasure_Point_ID(bf.getByte(0) & 0xFF);
        msg.setRequest_Set_Flag(bf.getByte(1) & 0xFF);
        msg.setRequest_Flag(bf.getShort(2) & 0xFFFF);
        msg.setMIN_Time_Cycle(bf.getByte(4) & 0xFF);
        msg.setMIN_Time_Interval(bf.getByte(5) & 0xFF);
        msg.setUL_Value(bf.getInt(6) & 0xFFFFFFFF);
        msg.setLL_Value(bf.getInt(10) & 0xFFFFFFFF);
        msg.setSettle_Date(bf.getByte(14) & 0xFF);
        msg.setVoltage_Level(bf.getInt(15) & 0xFFFFFFFF);
        msg.setMinData_AutoSend_Flag(bf.getByte(19) & 0xFF);
        msg.setDayData_AutoSend_Flag(bf.getByte(20) & 0xFF);
        msg.setMonData_AutoSend_Flag(bf.getByte(21) & 0xFF);
        msg.setSurpassAlarm_AutoSend_Flag(bf.getByte(22) & 0xFF);
        return msg;
    }
}
